import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_rating_bar/flutter_rating_bar.dart';

/// 2022年更新  适配 flutter 3.0
class TextFieldPage01 extends StatefulWidget {
  const TextFieldPage01({super.key});

  @override
  State<StatefulWidget> createState() {
    return TextFieldPage01State();
  }
}

class TextFieldPage01State extends State {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Padding(
          child: buildCenter(),
          padding: const EdgeInsets.all(20),
        ),
      ),
    );
  }

  buildCenter() {
    return TextField(
      //弹出的输入键盘为数字键盘
      keyboardType: TextInputType.number,
      //输入文本过滤器
      inputFormatters: [
        //只允许输入数字
        FilteringTextInputFormatter.digitsOnly,
        //只允许输入 19位以内
        LengthLimitingTextInputFormatter(19),
        //自定义的输入过滤器
        CardNumberInputFormatter(),
      ],
    );
  }
}

class CardNumberInputFormatter extends TextInputFormatter {
  @override
  TextEditingValue formatEditUpdate(
      TextEditingValue oldValue, TextEditingValue newValue) {

    print(" baseoffse is  ${newValue.selection.baseOffset}");
    //光标的位置 从0开始
    if (newValue.selection.baseOffset == 0) {
      return newValue;
    }
    //获取输入的文本
    String inuptData = newValue.text;
    //创建字符缓存体
    StringBuffer stringBuffer = new StringBuffer();

    for (int i = 0; i < inuptData.length; i++) {
      //获取每一个字条 inuptData[i]
      stringBuffer.write(inuptData[i]);
      //index 当前字条的位置
      int index = i + 1;
      //每四个字条中间添加一个空格 最后一位不在考虑范围里
      if (index % 4 == 0 && inuptData.length != index) {
        stringBuffer.write("  ");
      }
    }
    ///int baseOffset：开始的位置
    /// int extentOffset：结束的位置
    /// TextAffinity affinity：光标的位置
    ///bool isDirectional：是否消除了其基础和范围的歧义（不懂可以直接忽略）
    return TextEditingValue(
      //当前的文本
      text: stringBuffer.toString(),
      //光标的位置
      selection: TextSelection.collapsed(
        //设置光标的位置在 文本最后
        offset: stringBuffer.toString().length,
      ),
    );
  }
}
